<?php 
/** 
 * 数值的整数次方
 * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 * 注1：exponent 可能为负数，求倒数
 * 注2：exponent 为负数时，base不能为0
 * 注3：base为0，exponent为0时 0的0次幂无意义，可返回0或1
 * 注4：double浮点数，精确值，不能==作比较，需要精确度
 * 
 */


//方法一
function Power($base, int $exponent)
{
	if (equal($base, 0.0) && $exponent < 0) {
		exit('倒数分母不能为0');
	}

	$absExponent = $exponent;
	if ($exponent < 0) {
		$absExponent = -$absExponent;
	}
	$result = PowerWithUnsignedExponent1($base, $absExponent);
	if ($exponent < 0) {
		$result = 1.0 / $result;
	}
	return $result;
}

function PowerWithUnsignedExponent($base, int $exponent)
{
	$result = 1.0;
	for ($i = 0; $i < $exponent ; $i++) { 
		$result *= $base; 
	}
	return $result;
}

function equal($a, $b)
{
	if (($a - $b < 0.000001) && ($b - $a > -0.000001)) {
			return true;
	}
	return false;
}



//方法二
/** 
优化PowerWithUnsignedExponent
使用递归，时间复杂度O(logn)
当n为偶数，a^n =（a^n/2）*（a^n/2）
当n为奇数，a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
举例：
2^11 = 2^1 * 2^2 * 2^8
2^1011 = 2^0001 * 2^0010 * 2^1000
 * 
 */

function PowerWithUnsignedExponent1($base, $absExponent)
{
	if ($absExponent == 0) {
		return 1;
	}
	if ($absExponent == 1) {
		return $base;
	}
	$result = PowerWithUnsignedExponent1($base, $absExponent >> 1); // 偶数右移= n / 2, 奇数右移= (n - 1) / 2
	$result *= $result;//相乘
	if ($absExponent & 1) { // absExponent为奇数 则
		$result *= $base;
	}
	return $result;
}


echo Power(2, -10);


